#pragma once
#include "common.h"

#define CMDHASHTABLELEN 20

// 规定0-99为命令宏
//
// 使用枚举定义宏
typedef enum {
    CMD_CD, // 字符串"cd"
    CMD_LS,     // 字符串"ls"
    CMD_PWD,    // 字符串"pwd"
    CMD_PUTS,   // 字符串"puts"
    CMD_GETS,   // 字符串"gets"
    CMD_RM,     // 字符串"rm"
    CMD_MKDIR,  // 字符串"mkdir"
    CMD_MAX // 用于遍历全部的命令
    // 可拓展命令到99
} Cmd_enum;

// 命令和宏的储存结构体
typedef struct Cmd_s {
    int cmdCode;    // 命令编码，即枚举定义的宏
    char *cmdString;    // 命令字符串

    struct Cmd_s *next; // 指向下一个结构体
} Cmd_t;

// 定义静态数组用于初始化命令哈希表
static Cmd_t cmd[] = {
    {CMD_CD, (char *)"cd", NULL},
    {CMD_LS, (char *)"ls", NULL},
    {CMD_PWD, (char *)"pwd", NULL},
    {CMD_PUTS, (char *)"puts", NULL},
    {CMD_GETS, (char *)"gets", NULL},
    {CMD_RM, (char *)"rm", NULL},
    {CMD_MKDIR, (char *)"mkdir", NULL}
};

// 定义命令哈希表
typedef struct {
    Cmd_t *CmdTable[CMDHASHTABLELEN];
} CmdHash;

// 实现接口
//
// 初始化命令哈希表
CmdHash *init_cmdHash();
//
// 哈希函数
int hash(char *key);
//
// 根据cmdstring得到命令对应的宏
int get_cmdcode(char *cmdString);
//
// 解析命令、执行命令
void handle_cmd(const char *buf, int clientfd);







